home *** CD-ROM | disk | FTP | other *** search
- /*
- FileList 1.4
- "Options.c"
- */
-
- #include "Main.h"
- #include "Utilities.h"
- #include "Stack.h"
- #include "Search.h"
- #include "Options.h"
-
- #define OptionDialog 131 /* Options */
- #define OptionOk 1
- #define OptionSave 2
- #define OptionCancel 3
- #define OptionAuto 4
- #define OptionTabs 5
- #define OptionDate1 6
- #define OptionDate2 7
- #define OptionDate3 8
- #define OptionWindow 9
- #define OptionIcon 11
- #define OptionStuffit 12
- #define OptionCompactor 13
-
- #define MemoryDialog 133 /* Memory options */
- #define MemorySave 1
- #define MemoryCancel 2
- #define MemoryHeapF 3
- #define MemoryHeapT 4
- #define MemoryVolumesF 5
- #define MemoryVolumesT 6
- #define MemoryFilesF 7
- #define MemoryFilesT 8
- #define MemoryNameF 9
- #define MemoryNameT 10
- #define MemoryIcon 12
- #define MemoryFrame 13
-
- /* ----- Save options file --------------------------------------------- */
-
- static short SaveOptions (register ParameterPtr p)
- {
- register short err;
- register StringHandle str;
- short r;
- long count;
-
- err = 9999;
- if (!(str = GetString(OPTION_FILE)))
- goto done;
- HLock(str);
- FSDelete(*str, SysVRefNum);
- err = Create(*str, SysVRefNum, Creator, Options);
- if (!err)
- err = FSOpen(*str, SysVRefNum, &r);
- HUnlock(str);
- if (err)
- goto done;
- count = sizeof(Parameter);
- err = FSWrite(r, &count, p);
- FSClose(r);
- FlushVol(0L, SysVRefNum);
- done:
- return err;
- }
-
- /* ----- Set global variables ------------------------------------------ */
-
- static void SetGlobals (register ParameterPtr p)
- {
- Heap = p->heap;
- VolumeData.percent = p->volumes;
- FileData.percent= p->files;
- Record = p->name;
- DFormat1(p->date);
- Automatic = p->automatic;
- Stuffit = p->stuffit;
- Compactor = p->compactor;
- Tabs = p->tabs;
- VolumeData.rectangle = p->vwindow;
- FileData.rectangle = p->fwindow;
- if (Tabs) {
- VolumeData.string = VolumeToString2;
- FileData.string = FileToString2;
- } else {
- VolumeData.string = VolumeToString1;
- FileData.string = FileToString1;
- }
- CheckItem(VolumeM, vAuto, Automatic);
- }
-
- /* ----- Set up parameter record --------------------------------------- */
-
- static void SetParameter (register ParameterPtr p)
- {
- p->version = VERSION;
- p->heap = Heap;
- p->volumes = VolumeData.percent;
- p->files = FileData.percent;
- p->name = Record;
- p->date = DFormat2();
- p->automatic = Automatic;
- p->stuffit = Stuffit;
- p->compactor = Compactor;
- p->tabs = Tabs;
- p->vwindow = VolumeData.rectangle;
- p->fwindow = FileData.rectangle;
- }
-
- /* ----- Filter procedure for dialog ----------------------------------- */
-
- static pascal Boolean filter (
- register DialogPtr dialog,
- register EventRecord *event,
- register short *item)
- {
- register unsigned char ch;
-
- switch (event->what) {
- case keyDown:
- case autoKey:
- ch = event->message & charCodeMask;
- if (ch == 0x0D || ch == 0x03) {
- *item = MemoryCancel;
- return TRUE; /* Don't handle the event */
- } else
- if (ch >= '0' && ch <= '9') {
- /* digit */
- } else
- if (ch != 0x08 && ch != '\t') {
- SysBeep(1);
- event->what = nullEvent;
- }
- break;
- }
- return FALSE; /* Go ahead and handle the event */
- }
-
- /* ----- Convert local rectangle into global rectangle ----------------- */
-
- static void Convert (
- register WindowPtr w,
- register Rect *r)
- {
- GrafPtr port;
-
- GetPort(&port);
- SetPort(w);
- *r = w->portRect;
- LocalToGlobal(&topLeft(*r));
- LocalToGlobal(&botRight(*r));
- SetPort(port);
- }
-
- /* ----- Options dialog ------------------------------------------------ */
-
- static void DoOptions1 (void)
- {
- register DialogPtr dialog;
- register short i, date;
- short item;
- Boolean cont;
- Parameter parm;
-
- CenterDialog('DLOG', OptionDialog);
- if (dialog = GetNewDialog(OptionDialog, 0L, -1L)) {
- SetParameter(&parm);
- ControlSet(dialog, OptionTabs, parm.tabs);
- ControlSet(dialog, OptionAuto, parm.automatic);
- ControlSet(dialog, OptionWindow, 0);
- ControlSet(dialog, OptionStuffit, parm.stuffit);
- ControlSet(dialog, OptionCompactor, parm.compactor);
- date = parm.date + OptionDate1;
- for (i = OptionDate1; i <= OptionDate3; i++)
- ControlSet(dialog, i, i == date);
- cont = TRUE;
- SetUserItem(dialog, OptionIcon, (ProcPtr)DrawICN);
- do {
- ModalDialog(filter, &item);
- switch(item) {
- case OptionOk:
- case OptionSave:
- parm.automatic = ControlCheck(dialog, OptionAuto);
- parm.tabs = ControlCheck(dialog, OptionTabs);
- parm.stuffit = ControlCheck(dialog, OptionStuffit);
- parm.compactor = ControlCheck(dialog, OptionCompactor);
- if (parm.date != (date -= OptionDate1))
- Update();
- parm.date = date;
- if (ControlCheck(dialog, OptionWindow)) {
- Convert((WindowPtr)&VolumeData, &parm.vwindow);
- Convert((WindowPtr)&FileData, &parm.fwindow);
- }
- if (item == OptionSave && (i = SaveOptions(&parm))) {
- Message(ERR_DISK, i);
- break;
- }
- SetGlobals(&parm);
- case OptionCancel:
- cont = FALSE;
- break;
- case OptionTabs:
- case OptionAuto:
- case OptionWindow:
- case OptionStuffit:
- case OptionCompactor:
- ControlToggle(dialog, item);
- break;
- case OptionDate1:
- case OptionDate2:
- case OptionDate3:
- date = item;
- for (i = OptionDate1; i <= OptionDate3; i++)
- ControlSet(dialog, i, i == date);
- break;
- }
- } while(cont);
- DisposDialog(dialog);
- }
- }
-
- /* ----- Calculate percent value --------------------------------------- */
-
- static long Percent (register long x)
- {
- register long v;
-
- if (!InfoCount)
- return 0L;
- x *= 100;
- v = x/InfoCount;
- if (x % InfoCount > InfoCount/2)
- v++;
- return v;
- }
-
- /* ----- Calculate average name length --------------------------------- */
-
- static long Average (void)
- {
- register long v;
-
- if (!InfoCount)
- return 0L;
- v = InfoSize/InfoCount;
- if (InfoSize % InfoCount > InfoCount/2)
- v++;
- return v - sizeof(FileInfo) - 1;
- }
-
- /* ----- Memory options dialog ----------------------------------------- */
-
- static void DoOptions2 (void)
- {
- register DialogPtr dialog;
- register short i;
- short item;
- Boolean cont;
- Parameter parm;
-
- CenterDialog('DLOG', MemoryDialog);
- if (dialog = GetNewDialog(MemoryDialog, 0L, -1L)) {
- SetParameter(&parm);
- setNumber(dialog, MemoryHeapF, parm.heap);
- setNumber(dialog, MemoryVolumesF, (long)parm.volumes);
- setNumber(dialog, MemoryFilesF, (long)parm.files);
- setNumber(dialog, MemoryNameF, (long)parm.name);
- cont = TRUE;
- SetUserItem(dialog, MemoryIcon, (ProcPtr)DrawICN);
- SetUserItem(dialog, MemoryFrame, (ProcPtr)FrameItem);
- do {
- ModalDialog(filter, &item);
- switch(item) {
- case MemoryHeapT:
- SysBeep(1);
- break;
- case MemoryVolumesT:
- setNumber(dialog, MemoryVolumesF,
- Percent((long)VolumeData.count));
- break;
- case MemoryFilesT:
- setNumber(dialog, MemoryFilesF,
- Percent((long)FileData.count));
- break;
- case MemoryNameT:
- setNumber(dialog, MemoryNameF, Average());
- break;
- case MemorySave:
- parm.heap = getNumber(dialog, MemoryHeapF,
- 10240L, 16777216L);
- parm.volumes = getNumber(dialog, MemoryVolumesF,
- 1L, 32767L);
- parm.files = getNumber(dialog, MemoryFilesF,
- 1L, 32767L);
- parm.name = getNumber(dialog, MemoryNameF,
- 1L, 31L);
- if (i = SaveOptions(&parm)) {
- Message(ERR_DISK, i);
- break;
- }
- SetGlobals(&parm);
- case MemoryCancel:
- cont = FALSE;
- break;
- }
- } while(cont);
- DisposDialog(dialog);
- }
- }
-
- /* ----- Options dialog ------------------------------------------------ */
-
- void DoOptions (short option)
- {
- if (option & optionKey)
- DoOptions2();
- else
- DoOptions1();
- }
-